/*
 * 函数组合与管道工具函数
 * 用于组合多个函数以创建更复杂的功能
 */

/**
 * 从右到左组合多个函数
 * @template T - 第一个函数的输入类型
 * @template R - 最后一个函数的输出类型
 * @param {Function[]} funcs - 要组合的函数列表（可变参数）
 * @returns {(input: T) => R} 组合后的函数
 * @example
 * const addOne = x => x + 1;
 * const multiplyByTwo = x => x * 2;
 * const square = x => x * x;
 * 
 * const compute = compose(square, multiplyByTwo, addOne);
 * console.log(compute(3)); // ((3 + 1) * 2)² = 64
 */
export function compose<T>(): (input: T) => T;
export function compose<T, R>(...funcs: Function[]): (input: T) => R {
  if (funcs.length === 0) {
    // 返回一个恒等函数
    return (input: T) => input as unknown as R;
  }
  return (input: T) => {
    let result = input;
    for (let i = funcs.length - 1; i >= 0; i--) {
      result = funcs[i](result);
    }
    return result as unknown as R;
  };
}

/**
 * 从左到右组合多个函数(管道模式)
 * @template T - 第一个函数的输入类型
 * @template R - 最后一个函数的输出类型
 * @param {Function[]} funcs - 要组合的函数列表（可变参数）
 * @returns {(input: T) => R} 组合后的函数
 * @example
 * const addOne = x => x + 1;
 * const multiplyByTwo = x => x * 2;
 * const square = x => x * x;
 * 
 * const compute = pipe(addOne, multiplyByTwo, square);
 * console.log(compute(3)); // (3 + 1) * 2 的平方 = 64
 */
export function pipe<T>(): (input: T) => T;
export function pipe<T, R>(...funcs: Function[]): (input: T) => R {
  if (funcs.length === 0) {
    // 返回一个恒等函数
    return (input: T) => input as unknown as R;
  }

  return (input: T) => {
    let result = input;
    for (let i = 0; i < funcs.length; i++) {
      result = funcs[i](result);
    }
    return result as unknown as R;
  };
}